

<!DOCTYPE html>
<html lang="zh-CN" data-default-color-scheme=&#34;auto&#34;>



<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/img/favicon.png">
  <link rel="icon" href="/img/favicon.png">
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#2f4154">
  <meta name="description" content="本文适合有基础c、c++语言知识的人学习，同时也可当作python工具书查阅。  
前言
这里选择的是最新版 Python3 安装教程这里推荐：http://www.runoob.com/python3/python3-install.html win下载地址：https://www.python.org/downloads/windows Linux下载地址：https://www.python">
  <meta name="author" content="closer">
  <meta name="keywords" content="">
  
  <title>python学习之路 一：基础知识 - closer的自留地</title>

  <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" />


  <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/github-markdown-css@4.0.0/github-markdown.min.css" />
  <link  rel="stylesheet" href="/lib/hint/hint.min.css" />

  
    
    
      
      <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/highlight.js@10.6.0/styles/androidstudio.min.css" />
    
  

  
    <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css" />
  



<!-- 主题依赖的图标库，不要自行修改 -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_ba1fz6golrf.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_kmeydafke9r.css">


<link  rel="stylesheet" href="/css/main.css" />

<!-- 自定义样式保持在最底部 -->


  <script id="fluid-configs">
    var Fluid = window.Fluid || {};
    var CONFIG = {"hostname":"blog.zsaa.top","root":"/","version":"1.8.10","typing":{"enable":true,"typeSpeed":70,"cursorChar":"_","loop":false},"anchorjs":{"enable":true,"element":"h1,h2,h3,h4,h5,h6","placement":"right","visible":"always","icon":""},"progressbar":{"enable":true,"height_px":3,"color":"#29d","options":{"showSpinner":false,"trickleSpeed":100}},"copy_btn":true,"image_zoom":{"enable":true,"img_url_replace":["",""]},"toc":{"enable":true,"headingSelector":"h1,h2,h3,h4,h5,h6","collapseDepth":0},"lazyload":{"enable":true,"loading_img":"/img/loading.gif","onlypost":false,"offset_factor":2},"web_analytics":{"enable":true,"baidu":"608f2baddd361128381ad2bf9377bf89","google":null,"gtag":null,"tencent":{"sid":null,"cid":null},"woyaola":null,"cnzz":null,"leancloud":{"app_id":"YzLqNtMw1YEwwACli1FUsIUM-gzGzoHsz","app_key":"HLUt5izfTvTcbEbOrA59W92a","server_url":"https://yzlqntmw.lc-cn-n1-shared.com"}}};
  </script>
  <script  src="/js/utils.js" ></script>
  <script  src="/js/color-schema.js" ></script>
<meta name="generator" content="Hexo 5.4.0"></head>


<body>
  <header style="height: 70vh;">
    <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand"
       href="/">&nbsp;<strong>Hello</strong>&nbsp;</a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/">
                <i class="iconfont icon-home-fill"></i>
                首页
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/archives/">
                <i class="iconfont icon-archive-fill"></i>
                归档
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/categories/">
                <i class="iconfont icon-category-fill"></i>
                分类
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/tags/">
                <i class="iconfont icon-tags-fill"></i>
                标签
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/about/">
                <i class="iconfont icon-user-fill"></i>
                关于
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/links/">
                <i class="iconfont icon-link-fill"></i>
                友链
              </a>
            </li>
          
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" target="_self" data-toggle="modal" data-target="#modalSearch">&nbsp;<i
                class="iconfont icon-search"></i>&nbsp;</a>
          </li>
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" target="_self">&nbsp;<i
                class="iconfont icon-dark" id="color-toggle-icon"></i>&nbsp;</a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

    <div class="banner" id="banner" parallax=true
         style="background: url('/img/default.jpg') no-repeat center center;
           background-size: cover;">
      <div class="full-bg-img">
        <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
          <div class="page-header text-center fade-in-up">
            <span class="h2" id="subtitle" title="python学习之路 一：基础知识">
              
            </span>

            
              <div class="mt-3">
  
  
    <span class="post-meta">
      <i class="iconfont icon-date-fill" aria-hidden="true"></i>
      <time datetime="2020-02-12 10:40" pubdate>
        2020年2月12日 上午
      </time>
    </span>
  
</div>

<div class="mt-1">
  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-chart"></i>
      8.4k 字
    </span>
  

  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-clock-fill"></i>
      
      
      106
       分钟
    </span>
  

  
  
    
      <!-- LeanCloud 统计文章PV -->
      <span id="leancloud-page-views-container" class="post-meta" style="display: none">
        <i class="iconfont icon-eye" aria-hidden="true"></i>
        <span id="leancloud-page-views"></span> 次
      </span>
    
  
</div>

            
          </div>

          
        </div>
      </div>
    </div>
  </header>

  <main>
    
      

<div class="container-fluid nopadding-x">
  <div class="row nomargin-x">
    <div class="d-none d-lg-block col-lg-2"></div>
    <div class="col-lg-8 nopadding-x-md">
      <div class="container nopadding-x-md" id="board-ctn">
        <div class="py-5" id="board">
          <article class="post-content mx-auto">
            <!-- SEO header -->
            <h1 style="display: none">python学习之路 一：基础知识</h1>
            
              <p class="note note-info">
                
                  本文最后更新于：2021年12月25日 下午
                
              </p>
            
            <div class="markdown-body">
              <p>本文适合有基础c、c++语言知识的人学习，同时也可当作python工具书查阅。  </p>
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><ol>
<li><p>这里选择的是最新版 Python3<br> 安装教程这里推荐：<a target="_blank" rel="noopener" href="http://www.runoob.com/python3/python3-install.html">http://www.runoob.com/python3/python3-install.html</a><br> win下载地址：<a target="_blank" rel="noopener" href="https://www.python.org/downloads/windows">https://www.python.org/downloads/windows</a><br> Linux下载地址：<a target="_blank" rel="noopener" href="https://www.python.org/downloads/source">https://www.python.org/downloads/source</a>  </p>
</li>
<li><p>可视化开发工具IDE：<a target="_blank" rel="noopener" href="https://www.jetbrains.com/pycharm/download/">https://www.jetbrains.com/pycharm/download/</a></p>
</li>
<li><p><strong>因国内pip速度较慢，安装完python后建议改为国内清华大学镜像源，以下：</strong>  </p>
<ul>
<li><p>临时使用<br><code>pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 模块名字</code><span id="more"></span></p>
</li>
<li><p>设为默认<br>升级 pip 到最新的版本 (&gt;=10.0.0) 后进行配置：<br><code>pip install pip -U</code><br><code>pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple</code><br>如果您到 pip 默认源的网络连接较差，临时使用本镜像站来升级 pip：<br><code>pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U</code></p>
</li>
</ul>
</li>
<li><p>指定目录 pip下载及离线安装包</p>
<ul>
<li>将pip安装的包导出至requirements文件列表<br>cd进入想要下载的目录。<br><code>pip freeze &gt; requirements.txt</code></li>
<li>批量下载pip包<br><code>pip download -d d:\0\package -r requirements.txt</code></li>
<li>pip批量安装包及通过列表文件安装（先cd进入requirements所在目录）<br><code>pip install -r requirements.txt</code></li>
</ul>
</li>
</ol>
<h2 id="1-1基础语法"><a href="#1-1基础语法" class="headerlink" title="1.1基础语法"></a>1.1基础语法</h2><h3 id="1-1-1-输出"><a href="#1-1-1-输出" class="headerlink" title="1.1.1 输出"></a>1.1.1 输出</h3><p>打印 <code>print (&quot;Hello, Python!&quot;)</code><br>print 默认输出是换行的，如果要实现不换行需要在变量末尾加上逗号<code>,</code>。<br>不换行输出 <code>print(&#39;*&#39;, end=&#39; &#39;)</code>。  </p>
<figure class="highlight python"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs Python"><span class="hljs-comment"># 统计开始时间</span><br>startTime = time.time()<br><span class="hljs-comment"># 统计结束时间</span><br>endTime = time.time()<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;共花费时间： %d 秒&quot;</span> % (endTime - startTime))<br></code></pre></div></td></tr></table></figure>

<h3 id="1-1-2-字符串转义"><a href="#1-1-2-字符串转义" class="headerlink" title="1.1.2 字符串转义"></a>1.1.2 字符串转义</h3><p>特殊字符会使用反斜杠<code>\</code>来转义。比如<code>\n</code>表示换行，<code>\t</code>表示制表符，字符<code>\</code>本身也要转义，所以\表示的字符就是\<br><code>print(&#39;Isn\&#39;t, they said.&#39;)</code><br>如果不希望前置了 \ 的字符转义成特殊字符，而是使用<em>原始字符串</em>方式，在引号前添加 r 即可。<br><code>print(r&#39;C:\软件\python&#39;)</code><br>用三重引号可以跨行连续输入。<code>&quot;&quot;&quot;...&quot;&quot;&quot;</code>或<code>&#39;&#39;&#39;...&#39;&#39;&#39;</code><br>字符串可以用 + 进行连接（粘到一起），也可以用 * 进行重复:<code>3 * &#39;io&#39; + &#39; so easy&#39;</code>  </p>
<h3 id="1-1-3-脚本式编程"><a href="#1-1-3-脚本式编程" class="headerlink" title="1.1.3 脚本式编程"></a>1.1.3 脚本式编程</h3><p>Python 文件将以 <code>.py</code> 为扩展名。<br>在linux和mac上面编程时，已经设置了PATH变量，头文件加入<code>#!/usr/bin/python</code>，可以直接执行。</p>
<figure class="highlight python"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs python"><span class="hljs-comment">#!/usr/bin/python</span><br><span class="hljs-comment"># -*- coding: utf-8 -*-</span><br><span class="hljs-built_in">print</span> (<span class="hljs-string">&quot;Hello, Python!&quot;</span>)<br></code></pre></div></td></tr></table></figure>

<p>这里，假定您的Python解释器在/usr/bin目录中，使用以下命令执行脚本：</p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py">chmod +x test.py     <span class="hljs-comment"># 脚本文件添加可执行权限</span><br>./test.py<br></code></pre></div></td></tr></table></figure>

<h3 id="1-1-4-行和缩进"><a href="#1-1-4-行和缩进" class="headerlink" title="1.1.4 行和缩进"></a>1.1.4 行和缩进</h3><p>Python与其他语言最大的区别就是，Python 的代码块不使用大括号 {} 来控制类，函数以及其他逻辑判断。python 最具特色的就是用缩进来写模块。<br>缩进的空白数量是可变的，但是所有代码块语句必须包含相同的缩进空白数量(一般是四个空格)，这个必须严格执行。  </p>
<h3 id="1-1-5-注释"><a href="#1-1-5-注释" class="headerlink" title="1.1.5 注释"></a>1.1.5 注释</h3><p>python中单行注释采用 # 开头。<br>python 中多行注释使用三个单引号(‘’’)或三个双引号(“””)。  </p>
<h3 id="1-1-6-同一行显示多条语句"><a href="#1-1-6-同一行显示多条语句" class="headerlink" title="1.1.6 同一行显示多条语句"></a>1.1.6 同一行显示多条语句</h3><p>Python可以在同一行中使用多条语句，语句之间使用分号(;)分割。  </p>
<h3 id="1-1-7-多个语句构成代码组"><a href="#1-1-7-多个语句构成代码组" class="headerlink" title="1.1.7 多个语句构成代码组"></a>1.1.7 多个语句构成代码组</h3><p>缩进相同的一组语句构成一个代码块，我们称之代码组。<br>像if、while、def和class这样的复合语句，首行以关键字开始，以冒号( : )结束，该行之后的一行或多行代码构成代码组。<br>我们将首行及后面的代码组称为一个子句(clause)。<br>如下实例：</p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-keyword">if</span> expression :<br>   suite<br><span class="hljs-keyword">elif</span> expression :  <br>   suite  <br><span class="hljs-keyword">else</span> :  <br>   suite<br></code></pre></div></td></tr></table></figure>

<h2 id="1-2-变量类型"><a href="#1-2-变量类型" class="headerlink" title="1.2 变量类型"></a>1.2 变量类型</h2><h3 id="1-2-1-变量赋值"><a href="#1-2-1-变量赋值" class="headerlink" title="1.2.1 变量赋值"></a>1.2.1 变量赋值</h3><p>Python 中的变量赋值不需要类型声明。<br>Python允许你同时为多个变量赋值。例如：<br><code>a, b, c = 1, 2, &quot;john&quot;</code>  </p>
<h3 id="1-2-2-标准数据类型"><a href="#1-2-2-标准数据类型" class="headerlink" title="1.2.2 标准数据类型"></a>1.2.2 标准数据类型</h3><p>Python 定义了一些标准类型，用于存储各种类型的数据。<br>Python有五个标准的数据类型：  </p>
<ul>
<li>Numbers（数字）</li>
<li>String（字符串）</li>
<li>List（列表）</li>
<li>Tuple（元组）</li>
<li>Dictionary（字典）</li>
</ul>
<p>bool类型有True和False和None（等于NULL）。</p>
<h3 id="1-2-2-1-Python数字"><a href="#1-2-2-1-Python数字" class="headerlink" title="1.2.2.1 Python数字"></a>1.2.2.1 Python数字</h3><p>数字数据类型用于存储数值。他们是不可改变的数据类型，这意味着改变数字数据类型会分配一个新的对象。<br>当你指定一个值时，Number对象就会被创建：<br><code>var1 = 1</code><br>您也可以使用del语句删除一些对象的引用。del语句的语法是：<br><code>del var1[,var2[,var3[....,varN]]]]</code><br>您可以通过使用del语句删除单个或多个对象的引用。例如：<br><code>del var_a, var_b</code><br>Python支持四种不同的数字类型：</p>
<ul>
<li>int（有符号整型,如<code>0112L</code>,<code>0xDEFL</code>,<code>0x69</code>）# long 类型只在Python2.X版本中。在Python3.X版本中 long 类被 int 替代。</li>
<li>float（浮点型,<code>-32.54e100</code>）</li>
<li>complex（复数,<code>4.53e-7j</code>）</li>
</ul>
<h3 id="1-2-2-2-Python字符串"><a href="#1-2-2-2-Python字符串" class="headerlink" title="1.2.2.2 Python字符串"></a>1.2.2.2 Python字符串</h3><p>字符串或串(String)是由数字、字母、下划线组成的一串字符。<br>python的字串列表有2种取值顺序:  </p>
<ul>
<li>从左到右索引默认0开始的，最大范围是字符串长度少1</li>
<li>从右到左索引默认-1开始的，最大范围是字符串开头</li>
</ul>
<p>如果你要实现从字符串中获取一段子字符串的话，可以使用 [头下标:尾下标] 来截取相应的字符串，其中下标是从 0 开始算起，可以是正数或负数，下标可以为空表示取到头或尾。<br>[头下标:尾下标] 获取的子字符串包含头下标的字符，但不包含尾下标的字符。  </p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-meta">&gt;&gt;&gt; </span>s = <span class="hljs-string">&#x27;abcdef&#x27;</span><br><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;s[1:5]  &#x27;</span>,s[<span class="hljs-number">1</span>:<span class="hljs-number">5</span>])<br><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;s[-6:-4]  &#x27;</span>,s[-<span class="hljs-number">6</span>:-<span class="hljs-number">4</span>])<br>s[<span class="hljs-number">1</span>:<span class="hljs-number">5</span>]   bcde<br>s[-<span class="hljs-number">6</span>:-<span class="hljs-number">4</span>]   ab<br></code></pre></div></td></tr></table></figure>

<p>字符串格式化<br>在 Python 中，字符串格式化使用与 C 中 sprintf 函数一样的语法。  </p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;My name is %s and weight is %d kg!&quot;</span> % (<span class="hljs-string">&#x27;Zara&#x27;</span>, <span class="hljs-number">21</span>))<br>My name <span class="hljs-keyword">is</span> Zara <span class="hljs-keyword">and</span> weight <span class="hljs-keyword">is</span> <span class="hljs-number">21</span> kg!<br></code></pre></div></td></tr></table></figure>

<h3 id="1-2-2-3-Python列表"><a href="#1-2-2-3-Python列表" class="headerlink" title="1.2.2.3 Python列表"></a>1.2.2.3 Python列表</h3><p>List（列表）相当于c语言中的数组。 是 Python 中使用最频繁的数据类型。<br>列表可以完成大多数集合类的数据结构实现。它支持字符，数字，字符串甚至可以包含列表（即嵌套）。<br>列表用 <code>[ ]</code> 标识，是 python 最通用的复合数据类型。<br>列表中值的切割也可以用到变量 [头下标:尾下标] ，就可以截取相应的列表，从左到右索引默认 0 开始，从右到左索引默认 -1 开始，下标可以为空表示取到头或尾。<br>加号 + 是列表连接运算符，星号 * 是重复操作。如下实例：</p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">list</span> = [ <span class="hljs-string">&#x27;runoob&#x27;</span>, <span class="hljs-number">786</span> , <span class="hljs-number">2.23</span>, <span class="hljs-string">&#x27;john&#x27;</span>, <span class="hljs-number">70.2</span> ]<br><span class="hljs-meta">&gt;&gt;&gt; </span>tinylist = [<span class="hljs-number">123</span>, <span class="hljs-string">&#x27;john&#x27;</span>]<br><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">print</span> (<span class="hljs-string">&#x27;输出第1个至第三个元素  &#x27;</span>, <span class="hljs-built_in">list</span>[<span class="hljs-number">1</span>:<span class="hljs-number">3</span>]) <br><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">print</span> (<span class="hljs-string">&#x27;输出从第2个开始至列表末尾的所有元素   &#x27;</span>, <span class="hljs-built_in">list</span>[<span class="hljs-number">2</span>:])<br><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">print</span> (<span class="hljs-string">&#x27;输出列表两次    &#x27;</span>, tinylist * <span class="hljs-number">2</span>)<br><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">print</span> (<span class="hljs-string">&#x27;打印组合的列表    &#x27;</span>, <span class="hljs-built_in">list</span> + tinylist)<br>输出第<span class="hljs-number">1</span>个至第三个元素   [<span class="hljs-number">786</span>, <span class="hljs-number">2.23</span>]<br>输出从第<span class="hljs-number">2</span>个开始至列表末尾的所有元素    [<span class="hljs-number">2.23</span>, <span class="hljs-string">&#x27;john&#x27;</span>, <span class="hljs-number">70.2</span>]<br>输出列表两次     [<span class="hljs-number">123</span>, <span class="hljs-string">&#x27;john&#x27;</span>, <span class="hljs-number">123</span>, <span class="hljs-string">&#x27;john&#x27;</span>]<br>打印组合的列表     [<span class="hljs-string">&#x27;runoob&#x27;</span>, <span class="hljs-number">786</span>, <span class="hljs-number">2.23</span>, <span class="hljs-string">&#x27;john&#x27;</span>, <span class="hljs-number">70.2</span>, <span class="hljs-number">123</span>, <span class="hljs-string">&#x27;john&#x27;</span>]<br></code></pre></div></td></tr></table></figure>

<p>每当需要访问最后一个列表元素时，都可使用索引-1，来获取最后一个元素。如<code>list[-1]</code>。<br><code>squares = [value**2 for value in range(1,11)]</code>此列表解析生成1-10的平方数存入数组。<br><code>list[1]=list[:]</code>可以复制列表。  </p>
<h3 id="1-2-2-4-Python-元组"><a href="#1-2-2-4-Python-元组" class="headerlink" title="1.2.2.4 Python 元组"></a>1.2.2.4 Python 元组</h3><p>元组是另一个数据类型，类似于 List（列表）。<br>元组用 () 标识。内部元素用逗号隔开。但是元组不能二次赋值，相当于只读列表。<br><strong>元组是不允许更新的。而列表是允许更新的。</strong>  </p>
<h3 id="1-2-2-5-Python-字典"><a href="#1-2-2-5-Python-字典" class="headerlink" title="1.2.2.5 Python 字典"></a>1.2.2.5 Python 字典</h3><p>字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象集合，字典是无序的对象集合。<br>两者之间的区别在于：字典当中的元素是通过键来存取的，而不是通过偏移存取。<br>字典用”{ }”标识。字典由索引(key)和它对应的值value组成。  </p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">dict</span> = &#123;&#125;<br><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">dict</span>[<span class="hljs-string">&#x27;one&#x27;</span>] = <span class="hljs-string">&quot;This is one&quot;</span><br><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">dict</span>[<span class="hljs-number">2</span>] = <span class="hljs-string">&quot;This is two&quot;</span><br><span class="hljs-meta">&gt;&gt;&gt; </span>tinydict = &#123;<span class="hljs-string">&#x27;name&#x27;</span>: <span class="hljs-string">&#x27;john&#x27;</span>,<span class="hljs-string">&#x27;code&#x27;</span>:<span class="hljs-number">6734</span>, <span class="hljs-string">&#x27;dept&#x27;</span>: <span class="hljs-string">&#x27;sales&#x27;</span>&#125;<br><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">print</span> (<span class="hljs-built_in">dict</span>[<span class="hljs-string">&#x27;one&#x27;</span>])          <span class="hljs-comment"># 输出键为&#x27;one&#x27; 的值</span><br><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">print</span> (<span class="hljs-built_in">dict</span>[<span class="hljs-number">2</span>])              <span class="hljs-comment"># 输出键为 2 的值</span><br><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">print</span> (tinydict)             <span class="hljs-comment"># 输出完整的字典</span><br><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">print</span> (tinydict.keys())      <span class="hljs-comment"># 输出所有键</span><br><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">print</span> (tinydict.values())    <span class="hljs-comment"># 输出所有值</span><br>This <span class="hljs-keyword">is</span> one<br>This <span class="hljs-keyword">is</span> two<br>&#123;<span class="hljs-string">&#x27;name&#x27;</span>: <span class="hljs-string">&#x27;john&#x27;</span>, <span class="hljs-string">&#x27;code&#x27;</span>: <span class="hljs-number">6734</span>, <span class="hljs-string">&#x27;dept&#x27;</span>: <span class="hljs-string">&#x27;sales&#x27;</span>&#125;<br>dict_keys([<span class="hljs-string">&#x27;name&#x27;</span>, <span class="hljs-string">&#x27;code&#x27;</span>, <span class="hljs-string">&#x27;dept&#x27;</span>])<br>dict_values([<span class="hljs-string">&#x27;john&#x27;</span>, <span class="hljs-number">6734</span>, <span class="hljs-string">&#x27;sales&#x27;</span>])<br></code></pre></div></td></tr></table></figure>

<ol>
<li><p>修改字典中的值<br><code>dict[&#39;color&#39;] = &#39;yellow&#39;</code></p>
</li>
<li><p>删除键-值对<br><code>del dict[&#39;color&#39;]</code> # 删除键’color’<br><code>dict.clear()</code> # 清空字典<br><code>del dict</code> # 删除字典  </p>
</li>
<li><p>遍历字典</p>
 <figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-keyword">for</span> key, value <span class="hljs-keyword">in</span> <span class="hljs-built_in">dict</span>.items():<br>  <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;\nKey: &quot;</span> + key)<br>  <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Value: &quot;</span> + value)<br></code></pre></div></td></tr></table></figure></li>
</ol>
<h3 id="1-2-3-Python数据类型转换"><a href="#1-2-3-Python数据类型转换" class="headerlink" title="1.2.3 Python数据类型转换"></a>1.2.3 Python数据类型转换</h3><p>和c语言一样。当我们需要对数据内置的类型进行转换，数据类型的转换，你只需要将数据类型作为函数名即可。<br><code>float(2)</code>  </p>
<h3 id="1-2-4-如何查看模块及其方法的使用和它们的源码"><a href="#1-2-4-如何查看模块及其方法的使用和它们的源码" class="headerlink" title="1.2.4 如何查看模块及其方法的使用和它们的源码"></a>1.2.4 如何查看模块及其方法的使用和它们的源码</h3><ol>
<li>进入cmd或者终端，python交互模式。</li>
<li><code>import 模块名</code>  # 导入模块</li>
<li><code>dir(模块名)</code> # 查看模块拥有的方法</li>
<li><code>help(模块名)</code> # 查看模块介绍及其所含方法、拉到最后file后面查看源码路径</li>
<li><code>help(方法名)</code> # 查看方法的内置帮助、用法</li>
</ol>
<h2 id="1-3-运算符"><a href="#1-3-运算符" class="headerlink" title="1.3 运算符"></a>1.3 运算符</h2><p><code>+、-、*、/、%</code>和c语言一样<br><code>**</code>是幂，<code>2**3=8</code><br><code>//</code>是取整除,<code>9//2=4</code><br>比较运算符和c语言一样<br>赋值运算符和c语言一样，多了<code>**=</code>,<code>//=</code><br>位运算符和c语言一样<br>逻辑运算符:<code>and</code>等同于c语言中的<code>&amp;&amp;</code>，<code>or</code>等于c语言中的<code>||</code>，<code>not</code>等于c语言中的<code>!</code>  </p>
<h3 id="1-3-1-成员运算符"><a href="#1-3-1-成员运算符" class="headerlink" title="1.3.1 成员运算符"></a>1.3.1 成员运算符</h3><p>除了以上的一些运算符之外，Python还支持成员运算符，测试实例中包含了一系列的成员，包括字符串，列表或元组。  </p>
<ul>
<li>in<br>如果在指定的序列中找到值返回 True，否则返回 False。例子：x in y , 如果 x 在 y 序列中返回 True。</li>
<li>not in<br>如果在指定的序列中没有找到值返回 True，否则返回 False。例子：x not in y , 如果 x 不在 y 序列中返回 True。</li>
</ul>
<h3 id="1-3-2-身份运算符"><a href="#1-3-2-身份运算符" class="headerlink" title="1.3.2 身份运算符"></a>1.3.2 身份运算符</h3><p>身份运算符用于比较两个对象的存储单元.</p>
<ul>
<li>is<br>is 是判断两个标识符是不是引用自一个对象。例子：x is y, 类似 id(x) == id(y)</li>
<li>is not<br>is not 是判断两个标识符是不是引用自不同对象。例子：x is not y ， 类似 id(a) != id(b)</li>
</ul>
<h2 id="1-4-条件语句"><a href="#1-4-条件语句" class="headerlink" title="1.4 条件语句"></a>1.4 条件语句</h2><p><code>if</code>等用于c语言中<code>if</code>，<code>else</code>等同于c语言中<code>else</code>，<code>elif</code>等同于c语言中<code>else if</code><br>Python程序语言指定任何非0和非空（null）值为True，0 或者 null为False。<br>Python 编程中 if 语句用于控制程序的执行，基本形式为：</p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-keyword">if</span> 判断条件<span class="hljs-number">1</span>:<br>    执行语句<span class="hljs-number">1</span>……<br><span class="hljs-keyword">elif</span> 判断条件<span class="hljs-number">2</span>:<br>    执行语句<span class="hljs-number">2</span>……<br><span class="hljs-keyword">elif</span> 判断条件<span class="hljs-number">3</span>:<br>    执行语句<span class="hljs-number">3</span>……<br><span class="hljs-keyword">else</span>:<br>    执行语句<span class="hljs-number">4</span>……<br></code></pre></div></td></tr></table></figure>

<h2 id="1-5-循环语句"><a href="#1-5-循环语句" class="headerlink" title="1.5 循环语句"></a>1.5 循环语句</h2><p>有while，for循环，循环控制语句有break，continue，pass。  </p>
<h3 id="1-5-1-while"><a href="#1-5-1-while" class="headerlink" title="1.5.1 while"></a>1.5.1 while</h3><p>while 语句用于循环执行程序，即在某条件下，循环执行某段程序，以处理需要重复处理的相同任务。其基本形式为：  </p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-keyword">while</span> 判断条件(condition)：<br>    执行语句(statements)……<br></code></pre></div></td></tr></table></figure>

<p>例子：</p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py">pets = [<span class="hljs-string">&#x27;dog&#x27;</span>, <span class="hljs-string">&#x27;cat&#x27;</span>, <span class="hljs-string">&#x27;dog&#x27;</span>, <span class="hljs-string">&#x27;goldfish&#x27;</span>, <span class="hljs-string">&#x27;cat&#x27;</span>, <span class="hljs-string">&#x27;rabbit&#x27;</span>, <span class="hljs-string">&#x27;cat&#x27;</span>]<br><span class="hljs-keyword">while</span> <span class="hljs-string">&#x27;cat&#x27;</span> <span class="hljs-keyword">in</span> pets:<br>    pets.remove(<span class="hljs-string">&#x27;cat&#x27;</span>)<br><span class="hljs-built_in">print</span>(pets)<br></code></pre></div></td></tr></table></figure>

<h3 id="1-5-2-for"><a href="#1-5-2-for" class="headerlink" title="1.5.2 for"></a>1.5.2 for</h3><p>for循环的语法格式如下：</p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-keyword">for</span> 迭代变量(iterating_var) <span class="hljs-keyword">in</span> 数列、序列(sequence):<br>   执行语句(statements)<br></code></pre></div></td></tr></table></figure>

<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-built_in">sum</span> = <span class="hljs-number">0</span><br><span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">101</span>):<br>    <span class="hljs-built_in">sum</span> = <span class="hljs-built_in">sum</span> + x<br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">sum</span>) <span class="hljs-comment">#1-100的和，等于5050</span><br></code></pre></div></td></tr></table></figure>

<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py">L = [<span class="hljs-string">&#x27;Bart&#x27;</span>, <span class="hljs-string">&#x27;Lisa&#x27;</span>, <span class="hljs-string">&#x27;Adam&#x27;</span>]<br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> L:<br>    <span class="hljs-built_in">print</span>(i)<br></code></pre></div></td></tr></table></figure>

<h3 id="1-5-3-循环控制语句"><a href="#1-5-3-循环控制语句" class="headerlink" title="1.5.3 循环控制语句"></a>1.5.3 循环控制语句</h3><p>break,continue和c语言相同。pass就是一个空语句,不做任何事情，一般用做占位语句。。</p>
<h2 id="1-6-函数"><a href="#1-6-函数" class="headerlink" title="1.6 函数"></a>1.6 函数</h2><p>Python内置了很多有用的函数，我们可以直接调用。可以直接从Python的官方网站查看文档：<br><a target="_blank" rel="noopener" href="https://docs.python.org/zh-cn/3/library/functions.html#abs">Python的官方网站查看内置函数</a><br>比如求绝对值的函数abs，只有一个参数。<br>也可以在交互式命令行通过help(abs)查看abs函数的帮助信息。  </p>
<h3 id="1-6-1-定义函数"><a href="#1-6-1-定义函数" class="headerlink" title="1.6.1 定义函数"></a>1.6.1 定义函数</h3><p>你可以定义一个由自己想要功能的函数，以下是简单的规则：</p>
<ol>
<li>函数代码块以 def 关键词开头，后接函数标识符名称和圆括号 ()。</li>
<li>任何传入参数和自变量必须放在圆括号中间，圆括号之间可以用于定义参数。</li>
<li>函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。</li>
<li>函数内容以冒号起始，并且缩进。</li>
<li>return [表达式] 结束函数，选择性地返回一个值给调用方。不带表达式的return相当于返回 None。</li>
</ol>
<p>一般格式如下：</p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-function"><span class="hljs-keyword">def</span> 函数名（参数列表）:</span><br>    函数体<br></code></pre></div></td></tr></table></figure>

<p>python函数的使用方法基本上和c语言相同，不用指定返回类型，可以返回列表，字典等。  </p>
<p>一、python可以给函数指定默认值。<br><code>def student(name=&#39;Li Ming&#39;, age=18):</code><br>如果函数有一个实参默认值为空，则必须确保为空的实参在最后一个。如：<br><code>def get_name(first_name, last_name, middle_name=&#39;&#39;):</code>  </p>
<p>二、将列表传递给函数后，函数就可对其进行修改。在函数中对这个列表所做的任何修改都是永久性的，这让你能够高效地处理大量的数据。<br>有时候，需要禁止函数修改列表。这时候，可向函数传递列表的副本而不是原件。<br><code>def stu(name[:], age[:])</code>  </p>
<p>三、Python允许函数从调用语句中收集任意数量的实参。<br><code>def make_pizza(*toppings):</code><br>形参名 *toppings 中的星号让Python创建一个名为 toppings 的空元组，并将收到的所有值都封装到这个元组中。<br>如果要让函数接受不同类型的实参，必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参，再将余下的实参都收集到最后一个形参中。<br><code>def make_pizza(size, *toppings):</code>  </p>
<p>四、使用任意数量的关键字实参<br><code>def build_profile(first, last, **user_info):</code>  </p>
<h3 id="1-6-2-将函数存储在模块中"><a href="#1-6-2-将函数存储在模块中" class="headerlink" title="1.6.2 将函数存储在模块中"></a>1.6.2 将函数存储在模块中</h3><p>可以将函数存储在被称为模块的独立文件中，再将模块导入到主程序中。跟c语言差不多，c语言中用头文件，函数文件。  </p>
<ol>
<li>导入整个模块<br>假设<code>xxx.py</code>所在目录内有另外一个<code>pizza.py</code>，添加<code>import pizza</code>语句<br>导入名为模块 module_name.py 的的整个模块通用语法：<code>import module_name</code><br>可使用下面的语法来使用其中任何一个函数：<code>module_name.function_name ()</code></li>
<li>导入特定的函数<br><code>from module_name import function_0 , function_1 , function_2</code><br>通过用逗号分隔函数名，可根据需要从模块中导入任意数量的函数。<br>若使用这种语法，调用函数时就无需使用句点。<code>make_pizza(16, &#39;pepperoni&#39;)</code></li>
<li>使用 as 给函数指定别名<br>指定别名的通用语法如下：<code>from module_name import function_name as fn</code></li>
<li>使用 as 给模块指定别名<br>给模块指定别名的通用语法如下：<code>import module_name as mn</code></li>
<li>导入模块中的所有函数<br>最好只导入你需要用的函数，或者导入整个模块并使用句点表示法。<br>导入模块 module_name 中的所有函数通用语法如下：<code>from module_name import *</code></li>
</ol>
<p>所有的 import 语句都应放在文件开头，唯一例外的情形是，在文件开头使用了注释来描述整个程序。</p>
<h2 id="1-7-类"><a href="#1-7-类" class="headerlink" title="1.7 类"></a>1.7 类</h2><h3 id="1-7-1-创建类"><a href="#1-7-1-创建类" class="headerlink" title="1.7.1 创建类"></a>1.7.1 创建类</h3><p>根据约定，在Python中，首字母大写的名称指的是类。  </p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Dog</span>():</span><br>    <span class="hljs-string">&quot;&quot;&quot;一次模拟小狗的简单尝试&quot;&quot;&quot;</span><br>    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span>(<span class="hljs-params">self, name, age</span>):</span><br>        <span class="hljs-string">&quot;&quot;&quot;初始化属性name和age&quot;&quot;&quot;</span><br>        self.name = name<br>        self.age = age<br>        self.son = <span class="hljs-string">&#x27;zero&#x27;</span><br>    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">sit</span>(<span class="hljs-params">self</span>):</span><br>        <span class="hljs-string">&quot;&quot;&quot;模拟小狗被命令时蹲下&quot;&quot;&quot;</span><br>        <span class="hljs-built_in">print</span>(self.name.title() + <span class="hljs-string">&quot; is now sitting.&quot;</span>)<br>    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">roll_over</span>(<span class="hljs-params">self</span>):</span><br>        <span class="hljs-string">&quot;&quot;&quot;模拟小狗被命令时打滚&quot;&quot;&quot;</span><br>        <span class="hljs-built_in">print</span>(self.name.title() + <span class="hljs-string">&quot; rolled over!&quot;</span>)<br>my_dog = Dog(<span class="hljs-string">&#x27;willie&#x27;</span>, <span class="hljs-number">6</span>)<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;My dog&#x27;s name is &quot;</span> + my_dog.name.title() + <span class="hljs-string">&quot;.&quot;</span>)<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;My dog is &quot;</span> + <span class="hljs-built_in">str</span>(my_dog.age) + <span class="hljs-string">&quot; years old.&quot;</span>)<br>my_dog.sit()<br><span class="hljs-built_in">print</span>(my_dog.son)<br></code></pre></div></td></tr></table></figure>

<p>一 方法 <strong>init</strong>()<br>可参考c++中的构造函数。  </p>
<ol>
<li>我们将方法 <strong>init</strong>() 定义成了包含三个形参： self 、 name 和 age 。在这个方法的定义中，形参 self 必不可少，还必须位于其他形参的前面，相当于c++中的This指针。  </li>
<li>因为Python调用这个 <strong>init</strong>() 方法来创建 Dog 实例时，将自动传入实参 self 。每个与类相关联的方法调用都自动传递实参 self ，它是一个指向实例本身的引用，让实例能够访问类中的属性和方法。  </li>
<li>我们将通过实参向 Dog() 传递名字和年龄； self 会自动传递，因此我们不需要传递它。每当我们根据 Dog 类创建实例时，都只需给最后两个形参（ name 和 age ）提供值。  </li>
<li>Dog 类还定义了另外两个方法： sit() 和 roll_over() 。由于这些方法不需要额外的信息，如名字，因此它们只有一个形参 self 。  </li>
</ol>
<p>二 根据类创建实例</p>
<ol>
<li>访问属性<br>要访问实例的属性，可使用句点表示法。<code>my_dog.name</code></li>
<li>调用方法<br>用句点表示法来调用 Dog 类中定义的任何方法。<code>my_dog.roll_over()</code></li>
<li>给属性指定默认值<br>可以在方法 <strong>init</strong>()中添加默认值<br>如果你对某个属性这样做了，就无需包含为它提供初始值的形参。</li>
</ol>
<p>三 修改属性的值</p>
<ol>
<li>直接修改属性的值<br><code>my_dog.son=&#39;kuku&#39;</code></li>
<li>通过方法修改属性的值<br>等于在类里面新建一个方法，来修改类里面属性的值<br><code>def update_name(self, mile):</code><br>   <code>self.name = mile</code></li>
<li>通过方法对属性的值进行递增<br>跟2差不多，用方法里面的实参来修改。</li>
</ol>
<h3 id="1-7-2-继承"><a href="#1-7-2-继承" class="headerlink" title="1.7.2 继承"></a>1.7.2 继承</h3><figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ElectricCar</span>(<span class="hljs-params">Car</span>):</span><br>    <span class="hljs-string">&quot;&quot;&quot;电动汽车的独特之处&quot;&quot;&quot;</span><br>   <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span>(<span class="hljs-params">self, make, model, year</span>):</span><br>      <span class="hljs-string">&quot;&quot;&quot;初始化父类的属性&quot;&quot;&quot;</span><br>      <span class="hljs-built_in">super</span>().__init__(make, model, year)<br>      self.battery_size = <span class="hljs-number">70</span><br></code></pre></div></td></tr></table></figure>

<p>一 给子类定义属性和方法<br><strong>super() 是一个特殊函数，帮助Python将父类和子类关联起来。这行代码让Python调用ElectricCar 的父类的方法 <strong>init</strong>() ，让 ElectricCar 实例包含父类的所有属性。父类也称为超类（superclass），名称super因此而得名。</strong>  </p>
<p>二 重写父类的方法  </p>
<p>可在子类中定义一个这样的方法，即它与要重写的父类方法同名。这样，Python将不会考虑这个父类方法，而只关注你在子类中定义的相应方法。  </p>
<h3 id="1-7-3-导入类"><a href="#1-7-3-导入类" class="headerlink" title="1.7.3 导入类"></a>1.7.3 导入类</h3><p>Python允许你将类存储在模块中，然后在主程序中导入所需的模块。  </p>
<ol>
<li>导入类<br><code>from car import Car</code></li>
<li>从一个模块中导入多个类<br><code>from car import Car, ElectricCar</code></li>
<li>导入整个模块<br>你还可以导入整个模块，再使用句点表示法访问需要的类。<code>import car</code></li>
<li>导入模块中的所有类<br><code>from module_name import *</code> #不推荐这种方式</li>
<li>在一个模块中导入另一个模块</li>
</ol>
<h3 id="1-7-4-类编码风格"><a href="#1-7-4-类编码风格" class="headerlink" title="1.7.4 类编码风格"></a>1.7.4 类编码风格</h3><p>类名应采用驼峰命名法，即将类名中的每个单词的首字母都大写，而不使用下划线。实例名和模块名都采用小写格式，并在单词之间加上下划线。</p>
<h2 id="1-8-文件和异常"><a href="#1-8-文件和异常" class="headerlink" title="1.8 文件和异常"></a>1.8 文件和异常</h2><h3 id="1-8-1-从文件中读取数据"><a href="#1-8-1-从文件中读取数据" class="headerlink" title="1.8.1 从文件中读取数据"></a>1.8.1 从文件中读取数据</h3><h4 id="1-8-1-1-读取整个文件"><a href="#1-8-1-1-读取整个文件" class="headerlink" title="1.8.1.1 读取整个文件"></a>1.8.1.1 读取整个文件</h4><p>open() 函数常用形式是接收两个参数：文件名(file)和模式(mode)。<br><code>open(file, mode=&#39;r&#39;)</code><br>完整的语法格式为：<br><code>open(file, mode=&#39;r&#39;, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)</code><br>参数说明:</p>
<ul>
<li>file: 必需，文件路径（相对或者绝对路径）。</li>
<li>mode: 可选，文件打开模式</li>
<li>buffering: 设置缓冲</li>
<li>encoding: 一般使用utf8</li>
<li>errors: 报错级别</li>
<li>newline: 区分换行符</li>
<li>closefd: 传入的file参数类型</li>
<li>opener:</li>
</ul>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(<span class="hljs-string">&#x27;pi_digits.txt&#x27;</span>) <span class="hljs-keyword">as</span> file_object:<br>   contents = file_object.read()<br>   <span class="hljs-built_in">print</span>(contents)<br></code></pre></div></td></tr></table></figure>

<p>函数 open() 接受一个参数：要打开的文件的名称。 函数 open()返回一个表示文件的对象。Python将这个对象存储在我们将在后面使用的变量中。<br>关键字 ==with== 在不再需要访问文件后将其关闭。在这个程序中，我们没有调用 close() ；你只管打开文件，并在需要时使用它，Python自会在合适的时候自动将其关闭。<br>有了表示 pi_digits.txt 的文件对象后，我们使用方法 read() （前述程序的第2行）读取这个文件的全部内容，并将其作为一个长长的字符串存储在变量 contents 中。这样，通过打印 contents 的值，就可将这个文本文件的全部内容显示出来。<br>相比于原始文件，该输出唯一不同的地方是末尾多了一个空行。为何会多出这个空行呢？因为 read() 到达文件末尾时返回一个空字符串，而将这个空字符串显示出来时就是一个空行。要删除多出来的空行，可在 print 语句中使用 rstrip() ：<code>print(contents.rstrip())</code>  </p>
<h4 id="1-8-1-2-文件路径"><a href="#1-8-1-2-文件路径" class="headerlink" title="1.8.1.2 文件路径"></a>1.8.1.2 文件路径</h4><p>在Linux和OS X中，你可以这样编写代码：<br><code>file_path = &#39;/home/ehmatthes/other_files/text_files/filename.txt&#39;</code><br><code>with open(file_path) as file_object:</code><br>Windows系统中，在文件路径中使用反斜杠（ \ ）而不是斜杠（ / ）：<br><code>file_path = &#39;C:\Users\ehmatthes\other_files\text_files\filename.txt&#39;</code><br><code>with open(file_path) as file_object:</code>  </p>
<h4 id="1-8-1-3-逐行读取"><a href="#1-8-1-3-逐行读取" class="headerlink" title="1.8.1.3 逐行读取"></a>1.8.1.3 逐行读取</h4><figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py">filename = <span class="hljs-string">&#x27;pi_digits.txt&#x27;</span><br><span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(filename) <span class="hljs-keyword">as</span> file_object:<br>   <span class="hljs-keyword">for</span> a <span class="hljs-keyword">in</span> file_object:<br>      <span class="hljs-built_in">print</span>(a.rstrip())<br></code></pre></div></td></tr></table></figure>

<h4 id="1-8-1-4-创建一个包含文件各行内容的列表"><a href="#1-8-1-4-创建一个包含文件各行内容的列表" class="headerlink" title="1.8.1.4 创建一个包含文件各行内容的列表"></a>1.8.1.4 创建一个包含文件各行内容的列表</h4><figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py">filename = <span class="hljs-string">&#x27;pi_digits.txt&#x27;</span><br><span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(filename) <span class="hljs-keyword">as</span> file_object:<br>   lines = file_object.readlines()<br><span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:<br>   <span class="hljs-built_in">print</span>(line.rstrip())<br></code></pre></div></td></tr></table></figure>

<h4 id="1-8-1-5-使用文件的内容"><a href="#1-8-1-5-使用文件的内容" class="headerlink" title="1.8.1.5 使用文件的内容"></a>1.8.1.5 使用文件的内容</h4><figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py">filename = <span class="hljs-string">&#x27;pi_digits.txt&#x27;</span><br><span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(filename) <span class="hljs-keyword">as</span> file_object:<br>   lines = file_object.readlines()<br>pi_string = <span class="hljs-string">&#x27;&#x27;</span><br><span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:<br>   pi_string += line.strip()<br><span class="hljs-built_in">print</span>(pi_string)<br></code></pre></div></td></tr></table></figure>

<p>输出3.141592653589793238462643383279<br>在变量 pi_string 存储的字符串中，包含原来位于每行左边的空格，为删除这些空格，可使用 strip() 函数消除空格。<br><code>print str.strip( &#39;0&#39; );  # 去除首尾字符 0</code></p>
<h3 id="1-8-2-写入文件"><a href="#1-8-2-写入文件" class="headerlink" title="1.8.2 写入文件"></a>1.8.2 写入文件</h3><h4 id="1-8-2-1-写入空文件"><a href="#1-8-2-1-写入空文件" class="headerlink" title="1.8.2.1 写入空文件"></a>1.8.2.1 写入空文件</h4><figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py">filename = <span class="hljs-string">&#x27;a.txt&#x27;</span><br><span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(filename, <span class="hljs-string">&#x27;w&#x27;</span>) <span class="hljs-keyword">as</span> file_object:<br>   file_object.write(<span class="hljs-string">&quot;I love programming.\n&quot;</span>)<br></code></pre></div></td></tr></table></figure>

<p>打开文件时，可指定<strong>读取模式（ ‘r’ ）、写入模式（ ‘w’ ）、附加模式（ ‘a’ ）或让你能够读取和写入文件的模式（ ‘r+’ ）</strong>。如果<br>你省略了模式实参，Python将以默认的只读模式打开文件。<br><strong>Python只能将字符串写入文本文件。要将数值数据存储到文本文件中，必须先使用函数str() 将其转换为字符串格式。</strong></p>
<h4 id="1-8-2-2-写入多行"><a href="#1-8-2-2-写入多行" class="headerlink" title="1.8.2.2 写入多行"></a>1.8.2.2 写入多行</h4><p>每句后面加上换行符。</p>
<h3 id="1-8-3-异常"><a href="#1-8-3-异常" class="headerlink" title="1.8.3 异常"></a>1.8.3 异常</h3><p>Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生错误时，它都会创建一个异常对象。如果你编写了处理该异常的代码，程序将继续运行；如果你未对异常进行处理，程序将停止，并显示一个traceback，其中包含有关异常的报告。<br>异常是使用 try-except 代码块处理的。 try-except 代码块让Python执行指定的操作，同时告诉Python发生异常时怎么办。使用了 try-except 代码块时，即便出现异常，程序也将继续运行：显示你编写的友好的错误消息，而不是令用户迷惑的traceback。  </p>
<h4 id="1-8-3-1-使用-try-except-else-代码块"><a href="#1-8-3-1-使用-try-except-else-代码块" class="headerlink" title="1.8.3.1 使用 try-except-else 代码块"></a>1.8.3.1 使用 try-except-else 代码块</h4><figure class="highlight python"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs python"><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Give me two numbers, and I&#x27;ll divide them.&quot;</span>)<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Enter &#x27;q&#x27; to quit.&quot;</span>)<br><span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>   first_number = <span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;\nFirst number: &quot;</span>)<br>   <span class="hljs-keyword">if</span> first_number == <span class="hljs-string">&#x27;q&#x27;</span>:<br>     <span class="hljs-keyword">break</span><br>   second_number = <span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;Second number: &quot;</span>)<br>   <span class="hljs-keyword">try</span>:<br>      answer = <span class="hljs-built_in">int</span>(first_number) / <span class="hljs-built_in">int</span>(second_number)<br>   <span class="hljs-keyword">except</span> ZeroDivisionError:<br>      <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;You can&#x27;t divide by 0!&quot;</span>)<br>   <span class="hljs-keyword">else</span>:<br>      <span class="hljs-built_in">print</span>(answer)<br></code></pre></div></td></tr></table></figure>

<p>当你认为可能发生了错误时，可编写一个 <code>try-except</code> 代码块来处理可能引发的异常。<br>通过将可能引发错误的代码放在 <code>try-except</code> 代码块中，可提高这个程序抵御错误的能力。这个示例还包含一个 <code>else</code> 代码块；依赖于 <code>try</code> 代码块成功执行的代码都应放到 <code>else</code> 代码块中。<br><code>try-except-else</code> 代码块的工作原理大致如下：<strong>Python尝试执行 try 代码块中的代码；只有可能引发异常的代码才需要放在 try 语句中。有时候，有一些仅在 try 代码块成功执行时才需要运行的代码；这些代码应放在 else 代码块中。 except 代码块告诉Python，如果它尝试运行 try 代码块中的代码时引发了指定的异常，该怎么办。</strong>  </p>
<h4 id="1-8-3-2-如何捕获异常"><a href="#1-8-3-2-如何捕获异常" class="headerlink" title="1.8.3.2 如何捕获异常"></a>1.8.3.2 如何捕获异常</h4><p>异常的类型太多，是否有方法捕获所有异常呢？</p>
<figure class="highlight python"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs python"><span class="hljs-keyword">try</span>:<br>    <span class="hljs-built_in">print</span>(a)<br><span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;发生了异常:&#123;&#125;&quot;</span>.<span class="hljs-built_in">format</span>(e))<br></code></pre></div></td></tr></table></figure>

<p>但是使用这样的方式，我们只知道是报了某个错误，不知道是哪个文件哪个函数的哪一行错误。我们可以使用<code>traceback</code>获取详细的异常信息：</p>
<figure class="highlight python"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs python"><span class="hljs-keyword">import</span> traceback<br><br><span class="hljs-keyword">try</span>:<br>    <span class="hljs-built_in">print</span>(a)<br><span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>    traceback.print_exc()<br></code></pre></div></td></tr></table></figure>

<p>这样就比较直观，方便我们调试和修复代码。</p>
<h4 id="1-8-3-3-分析多个文本"><a href="#1-8-3-3-分析多个文本" class="headerlink" title="1.8.3.3 分析多个文本"></a>1.8.3.3 分析多个文本</h4><figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">count_words</span>(<span class="hljs-params">filename</span>):</span><br>   <span class="hljs-string">&quot;&quot;&quot;计算一个文件大致包含多少个单词&quot;&quot;&quot;</span><br>   <span class="hljs-keyword">try</span>:<br>      <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(filename) <span class="hljs-keyword">as</span> f_obj:<br>         contents = f_obj.read()<br>   <span class="hljs-keyword">except</span> FileNotFoundError:<br>      <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Sorry, the file &quot;</span> + filename + <span class="hljs-string">&quot; does not exist.&quot;</span>)<br>   <span class="hljs-keyword">else</span>:<br>      <span class="hljs-comment"># 计算文件大致包含多少个单词</span><br>      words = contents.split()<br>      num_words = <span class="hljs-built_in">len</span>(words)<br>      <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;The file &quot;</span> + filename + <span class="hljs-string">&quot; has about &quot;</span> + <span class="hljs-built_in">str</span>(num_words) + <span class="hljs-string">&quot; words.&quot;</span>)<br><br>filenames = [<span class="hljs-string">&#x27;0.txt&#x27;</span>, <span class="hljs-string">&#x27;1.txt&#x27;</span>, <span class="hljs-string">&#x27;2.txt&#x27;</span>, <span class="hljs-string">&#x27;3.txt&#x27;</span>]<br><span class="hljs-keyword">for</span> filename <span class="hljs-keyword">in</span> filenames:<br>   count_words(filename)<br></code></pre></div></td></tr></table></figure>

<p>如果你希望失败的时候不提示用户，可以在 except xxxError 后面添加一句pass。  </p>
<h3 id="1-8-4-存储数据"><a href="#1-8-4-存储数据" class="headerlink" title="1.8.4 存储数据"></a>1.8.4 存储数据</h3><p>模块 json 让你能够将简单的Python数据结构转储到文件中，并在程序再次运行时加载该文件中的数据。还可以使用 json 在Python程序之间分享数据。更重要的是，JSON数据格式并非Python专用的，这让你能够将以JSON格式存储的数据与使用其他编程语言的人分享。  </p>
<h4 id="1-8-4-1-使用-json-dump-和-json-load-保存和读取用户生成的数据"><a href="#1-8-4-1-使用-json-dump-和-json-load-保存和读取用户生成的数据" class="headerlink" title="1.8.4.1 使用 json.dump() 和 json.load() 保存和读取用户生成的数据"></a>1.8.4.1 使用 json.dump() 和 json.load() 保存和读取用户生成的数据</h4><figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-keyword">import</span> json<br><span class="hljs-comment"># 如果以前存储了用户名，就加载它</span><br><span class="hljs-comment"># 否则，就提示用户输入用户名并存储它</span><br>filename = <span class="hljs-string">&#x27;username.json&#x27;</span><br><span class="hljs-keyword">try</span>:<br>   <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(filename) <span class="hljs-keyword">as</span> f_obj:<br>      username = json.load(f_obj)<br><span class="hljs-keyword">except</span> FileNotFoundError:<br>   username = <span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;What is your name? &quot;</span>)<br>   <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(filename, <span class="hljs-string">&#x27;w&#x27;</span>) <span class="hljs-keyword">as</span> f_obj:<br>      json.dump(username, f_obj)<br>      <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;We&#x27;ll remember you when you come back, &quot;</span> + username + <span class="hljs-string">&quot;!&quot;</span>)<br><span class="hljs-keyword">else</span>:<br>   <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Welcome back, &quot;</span> + username + <span class="hljs-string">&quot;!&quot;</span>)<br></code></pre></div></td></tr></table></figure>

<p>先导入模块json，通过方法json.dump() 和 json.load()来保存用户名。<br>上面的程序，如果第一次执行，保存用户名到username，第二次执行则显示欢迎回来。  </p>
<h4 id="1-8-4-2-重构"><a href="#1-8-4-2-重构" class="headerlink" title="1.8.4.2 重构"></a>1.8.4.2 重构</h4><p>有时候，我们要保证高内聚，低耦合，需要将各个模块代码分为一系列完成具体工作的函数，这样的过程称为重构。<br>下面我们来重构上一节的代码：  </p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-keyword">import</span> json<br><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_stored_username</span>():</span><br>   <span class="hljs-string">&quot;&quot;&quot;如果存储了用户名，就获取它&quot;&quot;&quot;</span><br>   filename = <span class="hljs-string">&#x27;username.json&#x27;</span><br>   <span class="hljs-keyword">try</span>:<br>      <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(filename) <span class="hljs-keyword">as</span> f_obj:<br>         username = json.load(f_obj)<br>   <span class="hljs-keyword">except</span> FileNotFoundError:<br>      <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span><br>   <span class="hljs-keyword">else</span>:<br>      <span class="hljs-keyword">return</span> username<br><br><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_new_username</span>():</span><br>   <span class="hljs-string">&quot;&quot;&quot;提示用户输入用户名&quot;&quot;&quot;</span><br>   username = <span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;What is your name? &quot;</span>)<br>   filename = <span class="hljs-string">&#x27;username.json&#x27;</span><br>   <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(filename, <span class="hljs-string">&#x27;w&#x27;</span>) <span class="hljs-keyword">as</span> f_obj:<br>      json.dump(username, f_obj)<br>   <span class="hljs-keyword">return</span> username<br><br><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">greet_user</span>():</span><br>   <span class="hljs-string">&quot;&quot;&quot;问候用户，并指出其名字&quot;&quot;&quot;</span><br>   username = get_stored_username()<br>   <span class="hljs-keyword">if</span> username:<br>      <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Welcome back, &quot;</span> + username + <span class="hljs-string">&quot;!&quot;</span>)<br>   <span class="hljs-keyword">else</span>:<br>      username = get_new_username()<br>      <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;We&#x27;ll remember you when you come back, &quot;</span> + username + <span class="hljs-string">&quot;!&quot;</span>)<br><br>greet_user()<br></code></pre></div></td></tr></table></figure>

<p>在这个最终版本中，每个函数都执行单一而清晰的任务。要编写出清晰而易于维护和扩展的代码，划分工作必不可少。  </p>
<h2 id="1-9-测试代码"><a href="#1-9-测试代码" class="headerlink" title="1.9 测试代码"></a>1.9 测试代码</h2><p>这章中我们学习如何使用Python模块 unittest 中的工具来测试代码。</p>
<h3 id="1-9-1-测试函数"><a href="#1-9-1-测试函数" class="headerlink" title="1.9.1 测试函数"></a>1.9.1 测试函数</h3><h4 id="1-9-1-1-单元测试和测试用例"><a href="#1-9-1-1-单元测试和测试用例" class="headerlink" title="1.9.1.1 单元测试和测试用例"></a>1.9.1.1 单元测试和测试用例</h4><p>Python标准库中的模块 unittest 提供了代码测试工具。单元测试用于核实函数的某个方面没有问题；测试用例是一组单元测试，这些单元测试一起核实函数在各种情形下的行为都符合要求。良好的测试用例考虑到了函数可能收到的各种输入，包含针对所有这些情形的测试。全覆盖式测试用例包含一整套单元测试，涵盖了各种可能的函数使用方式。对于大型项目，要实现全覆盖可能很难。通常，最初只要针对代码的重要行为编写测试即可，等项目被广泛使用时再考虑全覆盖。  </p>
<h4 id="1-9-1-2-如何测试"><a href="#1-9-1-2-如何测试" class="headerlink" title="1.9.1.2 如何测试"></a>1.9.1.2 如何测试</h4><p>要为函数编写测试用例，可先导入模块 unittest 以及要测试的函数，再创建一个继承 unittest.TestCase 的类，并编写一系列方法对函数行为的不同方面进行测试。<br>下面是一个只包含一个方法的测试用例，它检查函数 get_formatted_name() 在给定名和姓时能否正确地工作：  </p>
<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-comment">#文件名name_function.py</span><br><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_formatted_name</span>(<span class="hljs-params">first, last, middle=<span class="hljs-string">&#x27;&#x27;</span></span>):</span><br>    <span class="hljs-string">&quot;&quot;&quot;生成整洁的姓名&quot;&quot;&quot;</span><br>    <span class="hljs-keyword">if</span> middle:<br>        full_name = first + <span class="hljs-string">&#x27; &#x27;</span> + middle + <span class="hljs-string">&#x27; &#x27;</span> + last<br>    <span class="hljs-keyword">else</span>:<br>        full_name = first + <span class="hljs-string">&#x27; &#x27;</span> + last<br>    <span class="hljs-keyword">return</span> full_name.title()<br></code></pre></div></td></tr></table></figure>

<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-keyword">import</span> unittest<br><span class="hljs-keyword">from</span> name_function <span class="hljs-keyword">import</span> get_formatted_name<br><span class="hljs-comment">#文件名test_name_ function.py</span><br><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NamesTestCase</span>(<span class="hljs-params">unittest.TestCase</span>):</span><br>    <span class="hljs-string">&quot;&quot;&quot;测试name_function.py&quot;&quot;&quot;</span><br>    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">test_first_last_name</span>(<span class="hljs-params">self</span>):</span><br>        <span class="hljs-string">&quot;&quot;&quot;能够正确地处理像Janis Joplin这样的姓名吗？&quot;&quot;&quot;</span><br>        formatted_name = get_formatted_name(<span class="hljs-string">&#x27;janis&#x27;</span>, <span class="hljs-string">&#x27;joplin&#x27;</span>)<br>        self.assertEqual(formatted_name, <span class="hljs-string">&#x27;Janis Joplin&#x27;</span>)<br><br>    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">test_first_last_middle_name</span>(<span class="hljs-params">self</span>):</span><br>        <span class="hljs-string">&quot;&quot;&quot;能够正确地处理像Wolfgang Amadeus Mozart这样的姓名吗？&quot;&quot;&quot;</span><br>        formatted_name = get_formatted_name(<span class="hljs-string">&#x27;wolfgang&#x27;</span>, <span class="hljs-string">&#x27;mozart&#x27;</span>, <span class="hljs-string">&#x27;amadeus&#x27;</span>)<br>        self.assertEqual(formatted_name, <span class="hljs-string">&#x27;Wolfgang Amadeus Mozart&#x27;</span>)<br><br>unittest.main()<br></code></pre></div></td></tr></table></figure>

<p>首先，我们导入了模块 unittest 和要测试的函数 get_formatted_ name() 。我们创建了一个名为 NamesTestCase（名字随便） 的类，用于包含一系列针对 get_formatted_name() 的单元测试。这个类必须继承unittest.TestCase 类，这样Python才知道如何运行你编写的测试。<br>我们运行 test_name_function.py 时，所有以 test_ 打头的方法都将自动运行。<br>在这个方法中，我们调用了要测试的函数，并存储了要测试的返回值。<br>最后我们使用了 unittest 类最有用的功能之一：一个断言方法。断言方法用来核实得到的结果是否与期望的结果一致。<br>我们调用 <strong>unittest 的方法 assertEqual()</strong> ，并向它传递 formatted_name 和 ‘Janis Joplin’ 。代码行 <code>self.assertEqual(formatted_name, &#39;Janis Joplin&#39;)</code> 的意思是说：“将 formatted_name 的值同字符串 ‘Janis Joplin’ 进行比较，如果它们相等，就万事大吉，如果它们不相等，跟我说一声！”  </p>
<h3 id="1-9-2-测试类"><a href="#1-9-2-测试类" class="headerlink" title="1.9.2 测试类"></a>1.9.2 测试类</h3><h4 id="1-9-2-1-各种断言方法"><a href="#1-9-2-1-各种断言方法" class="headerlink" title="1.9.2.1 各种断言方法"></a>1.9.2.1 各种断言方法</h4><p>Python在 unittest.TestCase 类中提供了很多断言方法。如下：  </p>
<table>
<thead>
<tr>
<th>方 法</th>
<th>用 途</th>
</tr>
</thead>
<tbody><tr>
<td>assertEqual(a, b)</td>
<td>核实 a == b</td>
</tr>
<tr>
<td>assertNotEqual(a, b)</td>
<td>核实 a != b</td>
</tr>
<tr>
<td>assertTrue(x)</td>
<td>核实 x 为 True</td>
</tr>
<tr>
<td>assertFalse(x)</td>
<td>核实 x 为 False</td>
</tr>
<tr>
<td>assertIn( item , list )</td>
<td>核实 item 在 list 中</td>
</tr>
<tr>
<td>assertNotIn( item , list )</td>
<td>核实 item 不在 list 中</td>
</tr>
</tbody></table>
<h4 id="1-9-2-2-方法-setUp"><a href="#1-9-2-2-方法-setUp" class="headerlink" title="1.9.2.2 方法 setUp()"></a>1.9.2.2 方法 setUp()</h4><figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AnonymousSurvey</span>():</span><br>    <span class="hljs-string">&quot;&quot;&quot;收集匿名调查问卷的答案&quot;&quot;&quot;</span><br>    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span>(<span class="hljs-params">self, question</span>):</span><br>        <span class="hljs-string">&quot;&quot;&quot;存储一个问题，并为存储答案做准备&quot;&quot;&quot;</span><br>        self.question = question<br>        self.responses = []<br><br>    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">show_question</span>(<span class="hljs-params">self</span>):</span><br>        <span class="hljs-string">&quot;&quot;&quot;显示调查问卷&quot;&quot;&quot;</span><br>        <span class="hljs-built_in">print</span>(question)<br><br>    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">store_response</span>(<span class="hljs-params">self, new_response</span>):</span><br>        <span class="hljs-string">&quot;&quot;&quot;存储单份调查答卷&quot;&quot;&quot;</span><br>        self.responses.append(new_response)<br><br>    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">show_results</span>(<span class="hljs-params">self</span>):</span><br>        <span class="hljs-string">&quot;&quot;&quot;显示收集到的所有答卷&quot;&quot;&quot;</span><br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Survey results:&quot;</span>)<br>        <span class="hljs-keyword">for</span> response <span class="hljs-keyword">in</span> responses:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;- &#x27;</span> + response)<br></code></pre></div></td></tr></table></figure>

<figure class="highlight py"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs py"><span class="hljs-keyword">import</span> unittest<br><span class="hljs-keyword">from</span> survey <span class="hljs-keyword">import</span> AnonymousSurvey<br><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestAnonymousSurvey</span>(<span class="hljs-params">unittest.TestCase</span>):</span><br>    <span class="hljs-string">&quot;&quot;&quot;针对AnonymousSurvey类的测试&quot;&quot;&quot;</span><br>    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">setUp</span>(<span class="hljs-params">self</span>):</span><br>    <span class="hljs-comment"># 创建一个调查对象和一组答案，供使用的测试方法使用</span><br>        question = <span class="hljs-string">&quot;What language did you first learn to speak?&quot;</span><br>        self.my_survey = AnonymousSurvey(question)<br>        self.responses = [<span class="hljs-string">&#x27;English&#x27;</span>, <span class="hljs-string">&#x27;Spanish&#x27;</span>, <span class="hljs-string">&#x27;Mandarin&#x27;</span>]<br><br>    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">test_store_single_response</span>(<span class="hljs-params">self</span>):</span><br>        <span class="hljs-string">&quot;&quot;&quot;测试单个答案会被妥善地存储&quot;&quot;&quot;</span><br>        self.my_survey.store_response(self.responses[<span class="hljs-number">0</span>])<br>        self.assertIn(self.responses[<span class="hljs-number">0</span>], self.my_survey.responses)<br><br>    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">test_store_three_responses</span>(<span class="hljs-params">self</span>):</span><br>        <span class="hljs-string">&quot;&quot;&quot;测试三个答案会被妥善地存储&quot;&quot;&quot;</span><br>        <span class="hljs-keyword">for</span> response <span class="hljs-keyword">in</span> self.responses:<br>            self.my_survey.store_response(response)<br>        <span class="hljs-keyword">for</span> response <span class="hljs-keyword">in</span> self.responses:<br>            self.assertIn(response, self.my_survey.responses)<br><br>unittest.main()<br></code></pre></div></td></tr></table></figure>

<p>使用 setUp() 来创建一个调查对象和一组答案，供方法 <code>test_store_single_response()</code> 和 <code>test_store_three_responses()</code> 使用。<br>方法 setUp() 做了两件事情：创建一个调查对象（见方法setUp()第4行）；创建一个答案列表（见方法setUp()第5行）。<br>这让两个测试方法都更简单，因为它们都不用创建调查对象和答案。方法 <code>test_store_three_response()</code> 核实 self.responses 中的第一个答案—— self.responses[0] ——被妥善地存储，而方法 <code>test_store_three_response()</code> 核实 self.responses 中的全部三个答案都被妥善地存储。  </p>

            </div>
            <hr>
            <div>
              <div class="post-metas mb-3">
                
                  <div class="post-meta mr-3">
                    <i class="iconfont icon-category"></i>
                    
                      <a class="hover-with-bg" href="/categories/python/">python</a>
                    
                      <a class="hover-with-bg" href="/categories/python/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/">读书笔记</a>
                    
                  </div>
                
                
                  <div class="post-meta">
                    <i class="iconfont icon-tags"></i>
                    
                      <a class="hover-with-bg" href="/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/">读书笔记</a>
                    
                      <a class="hover-with-bg" href="/tags/python/">python</a>
                    
                  </div>
                
              </div>
              
                <p class="note note-warning">
                  
                    本博客所有文章除特别声明外，均采用 <a target="_blank" href="https://creativecommons.org/licenses/by-sa/4.0/deed.zh" rel="nofollow noopener noopener">CC BY-SA 4.0 协议</a> ，转载请注明出处！
                  
                </p>
              
              
                <div class="post-prevnext">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/2020/02/12/hexo/%E5%A6%82%E4%BD%95%E5%9C%A8markdown%E4%B8%AD%E4%BC%98%E9%9B%85%E7%9A%84%E7%BC%96%E8%BE%91%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F/">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">如何在markdown中优雅的编辑数学公式</span>
                        <span class="visible-mobile">上一篇</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                      <a href="/2020/02/11/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/%E5%A4%A7%E8%AF%9D%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AC%94%E8%AE%B0/%E7%AC%AC9%E7%AB%A0%20%E6%8E%92%E5%BA%8F/">
                        <span class="hidden-mobile">大话数据结构第九章 排序</span>
                        <span class="visible-mobile">下一篇</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </article>
                </div>
              
            </div>

            
              <!-- Comments -->
              <article class="comments" id="comments" lazyload>
                
                  
                
                
  <div id="valine"></div>
  <script type="text/javascript">
    Fluid.utils.loadComments('#valine', function() {
      Fluid.utils.createScript('https://cdn.jsdelivr.net/npm/valine@1.4.14/dist/Valine.min.js', function () {
        new Valine({
          el: "#valine",
          app_id: "YzLqNtMw1YEwwACli1FUsIUM-gzGzoHsz",
          app_key: "HLUt5izfTvTcbEbOrA59W92a",
          placeholder: "畅所欲言...",
          path: window.location.pathname,
          avatar: "robohash",
          meta: ["nick","mail","link"],
          pageSize: "10",
          lang: "zh-CN",
          highlight: true,
          recordIP: false,
          serverURLs: "",
        });
      });
    });
  </script>
  <noscript>Please enable JavaScript to view the comments</noscript>


              </article>
            
          </article>
        </div>
      </div>
    </div>
    
      <div class="d-none d-lg-block col-lg-2 toc-container" id="toc-ctn">
        <div id="toc">
  <p class="toc-header"><i class="iconfont icon-list"></i>&nbsp;目录</p>
  <div class="toc-body" id="toc-body"></div>
</div>

      </div>
    
  </div>
</div>

<!-- Custom -->

  <div class="col-lg-7 mx-auto nopadding-x-md">
    <div class="container custom post-custom mx-auto">
      <img src="https://closer_laps.coding.net/p/picture/d/picture/git/raw/master/pay/pay.png" srcset="/img/loading.gif" lazyload class="rounded mx-auto d-block mt-3" style="width:355.4px; height:200px;">
    </div>
  </div>


    

    
      <a id="scroll-top-button" href="#" role="button">
        <i class="iconfont icon-arrowup" aria-hidden="true"></i>
      </a>
    

    
      <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">搜索</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v"
                 for="local-search-input">关键词</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>
    

    
  </main>

  <footer class="text-center mt-5 py-3">
  <div class="footer-content">
     <a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>Hexo</span></a> <i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>Fluid</span></a> 
  </div>
  
  <div class="statistics">
    
    

    
      
        <!-- LeanCloud 统计PV -->
        <span id="leancloud-site-pv-container" style="display: none">
            总访问量 
            <span id="leancloud-site-pv"></span>
             次
          </span>
      
      
        <!-- LeanCloud 统计UV -->
        <span id="leancloud-site-uv-container" style="display: none">
            总访客数 
            <span id="leancloud-site-uv"></span>
             人
          </span>
      

    
  </div>


  
  <!-- 备案信息 -->
  <div class="beian">
    <span>
      <a href="http://beian.miit.gov.cn/" target="_blank" rel="nofollow noopener">
        苏ICP备20032307号
      </a>
    </span>
    
      
        <span>
          <a
            href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=32020602001023"
            rel="nofollow noopener"
            class="beian-police"
            target="_blank"
          >
            
              <span style="visibility: hidden; width: 0">|</span>
              <img src="/img/police_beian.png" srcset="/img/loading.gif" lazyload alt="police-icon"/>
            
            <span>苏公网安备 32020602001023号</span>
          </a>
        </span>
      
    
  </div>


  
</footer>


  <!-- SCRIPTS -->
  
  <script  src="https://cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.min.js" ></script>
  <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.min.css" />

  <script>
    NProgress.configure({"showSpinner":false,"trickleSpeed":100})
    NProgress.start()
    window.addEventListener('load', function() {
      NProgress.done();
    })
  </script>


<script  src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" ></script>
<script  src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.min.js" ></script>
<script  src="/js/events.js" ></script>
<script  src="/js/plugins.js" ></script>

<!-- Plugins -->


  
    <script  src="/js/img-lazyload.js" ></script>
  



  



  <script  src="https://cdn.jsdelivr.net/npm/tocbot@4.12.2/dist/tocbot.min.js" ></script>



  <script  src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js" ></script>



  <script  src="https://cdn.jsdelivr.net/npm/anchor-js@4.3.0/anchor.min.js" ></script>



  <script defer src="https://cdn.jsdelivr.net/npm/clipboard@2.0.8/dist/clipboard.min.js" ></script>




  <script defer src="/js/leancloud.js" ></script>



  <script  src="https://cdn.jsdelivr.net/npm/typed.js@2.0.11/lib/typed.min.js" ></script>
  <script>
    (function (window, document) {
      var typing = Fluid.plugins.typing;
      var title = document.getElementById('subtitle').title;
      
      typing(title)
      
    })(window, document);
  </script>



  <script  src="/js/local-search.js" ></script>
  <script>
    (function () {
      var path = "/local-search.xml";
      $('#local-search-input').on('click', function() {
        searchFunc(path, 'local-search-input', 'local-search-result');
      });
      $('#modalSearch').on('shown.bs.modal', function() {
        $('#local-search-input').focus();
      });
    })()
  </script>





  

  
    <!-- MathJax -->
    <script>
      MathJax = {
        tex: {
          inlineMath: [['$', '$'], ['\\(', '\\)']]
        },
        options: {
          renderActions: {
            findScript: [10, doc => {
              document.querySelectorAll('script[type^="math/tex"]').forEach(node => {
                const display = !!node.type.match(/; *mode=display/);
                const math = new doc.options.MathItem(node.textContent, doc.inputJax[0], display);
                const text = document.createTextNode('');
                node.parentNode.replaceChild(text, node);
                math.start = { node: text, delim: '', n: 0 };
                math.end = { node: text, delim: '', n: 0 };
                doc.math.push(math);
              });
            }, '', false],
            insertedScript: [200, () => {
              document.querySelectorAll('mjx-container').forEach(node => {
                let target = node.parentNode;
                if (target.nodeName.toLowerCase() === 'li') {
                  target.parentNode.classList.add('has-jax');
                }
              });
            }, '', false]
          }
        }
      };
    </script>

    <script async src="https://cdn.jsdelivr.net/npm/mathjax@3.1.2/es5/tex-svg.js" ></script>

  








  
    <!-- Baidu Analytics -->
    <script defer>
      var _hmt = _hmt || [];
      (function () {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?608f2baddd361128381ad2bf9377bf89";
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
      })();
    </script>
  

  

  

  

  

  





<!-- 主题的启动项 保持在最底部 -->
<script  src="/js/boot.js" ></script>


</body>
</html>
